package edu.ar.bases.dvdstore.domainmodel.services;


import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;

import edu.ar.bases.dvdstore.domainmodel.entities.Alquiler;
import edu.ar.bases.dvdstore.domainmodel.entities.Cliente;
import edu.ar.bases.dvdstore.domainmodel.entities.Devolucion;
import edu.ar.bases.dvdstore.domainmodel.entities.Dvd;
import edu.ar.bases.dvdstore.domainmodel.entities.Evento;
import edu.ar.bases.dvdstore.domainmodel.repositories.interfaces.IClienteRepository;
import edu.ar.bases.dvdstore.domainmodel.repositories.interfaces.IDvdRepository;
import edu.ar.bases.dvdstore.domainmodel.services.interfaces.IClienteService;



public class ClienteService implements IClienteService  {

	private IClienteRepository clienteRepository;
	private IDvdRepository dvdRepository;
	
	public ClienteService() {
	}
	
	
	/* (non-Javadoc)
	 * @see edu.ar.bases.dvdstore.domainmodel.services.IClienteService#findAll()
	 */
	public Collection<Cliente> findAll()
	{
		return clienteRepository.findAll();
	}
	
	
	/* (non-Javadoc)
	 * @see edu.ar.bases.dvdstore.domainmodel.services.IClienteService#addCliente(edu.ar.bases.dvdstore.domainmodel.entities.Cliente)
	 */
	public void addCliente(Cliente obj)
	{
		clienteRepository.save(obj);
	}

	/* (non-Javadoc)
	 * @see edu.ar.bases.dvdstore.domainmodel.services.IClienteService#getClienteRepository()
	 */
	public IClienteRepository getClienteRepository() {
		return clienteRepository;
	}

	/* (non-Javadoc)
	 * @see edu.ar.bases.dvdstore.domainmodel.services.IClienteService#setClienteRepository(edu.ar.bases.dvdstore.domainmodel.repositories.interfaces.IClienteRepository)
	 */
	public void setClienteRepository(
			IClienteRepository ClienteRepository) {
		this.clienteRepository = ClienteRepository;
	}

	/* (non-Javadoc)
	 * @see edu.ar.bases.dvdstore.domainmodel.services.IClienteService#alquilar(java.lang.Integer, java.lang.Integer)
	 */
	public void alquilar(Integer clienteID, Integer dvdID) {
		Alquiler alquiler = new Alquiler();
		Devolucion devolucion=new Devolucion();
		Evento evento = new Evento();
		Cliente cliente= clienteRepository.findById(clienteID);
		Dvd dvd=dvdRepository.findById(dvdID);
		
		Set<Evento> eventos=cliente.getEventos();
		Date fechaDevolucion = null;
		devolucion.setFecha(fechaDevolucion);
		alquiler.setFecha(new Date());
		/* Se setean los atributos de evento y se lo agrega al set del cliente*/
		evento.setAlquiler(alquiler);
		evento.setDevolucion(devolucion);
		eventos.add(evento);
		cliente.setEventos(eventos);
		evento.setDvd(dvd);
		/* Se setean los atributos de devolucion */
		devolucion.setEvento(evento);
		/* Se setean los atributos de alquiler */	
		alquiler.setEvento(evento);		
	}
	
	
	/* Metodo que cierra un alquiler y devuelve los dias extra */
	/* (non-Javadoc)
	 * @see edu.ar.bases.dvdstore.domainmodel.services.IClienteService#devolver(edu.ar.bases.dvdstore.domainmodel.entities.Cliente, edu.ar.bases.dvdstore.domainmodel.entities.Dvd)
	 */
	public long devolver(Cliente cliente, Dvd dvd) {
		Evento eventoACerrar = null;
		long diasExtra=0;
		boolean found=false;
		Set<Evento> eventos=cliente.getEventos();
		Iterator<Evento> iter=eventos.iterator();
		
		while(!found  && iter.hasNext()){
			eventoACerrar=iter.next();
			if(dvd.equals(eventoACerrar.getDvd())){
				found=true;
			}
		}
		Date fechaAlquiler=eventoACerrar.alquiler.getFecha();
		eventoACerrar.devolucion.setFecha(new Date());
		diasExtra=(eventoACerrar.devolucion.getFecha().getTime()-fechaAlquiler.getTime()-1)/(24 * 60 * 60 * 1000);
		if(diasExtra==-1)
			diasExtra=0;
		return diasExtra;
		
	}
}

